﻿// 五子棋.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
* 实现一个手动的五子棋程序
* 程序启动显示如下：
* 1.显示12 * 12 的棋盘（0），提示甲方走棋
* 2.甲方输入一个行列数坐标，表示下棋   3 4
* 3.重新打印棋盘，甲方落棋处显示1，提示乙方下棋
* 4.重新打印棋盘，乙方落棋处显示2，提示甲方下棋
*
*注意：甲乙双方每次下棋后，重新显示棋盘数据，需要判断落子处，
* 横、竖、斜是否有连续的5个棋子，判断赢，退出程序
*/


#include <stdio.h>
#include <iostream>
#include<time.h>


	



//判定后下棋，甲下完棋后将l置为1，乙下完棋后将l置为0；
//下棋时输入的坐标不能超过棋盘界限，也不能在已经下过的地方重复下；
//判断输赢；
//前后判断，
//上下判断
//左上+右下判断
//左下+右上判断


int main()
{
	int arr[12][12] = {0};//初始化棋盘，初始值全部为0
	int l = 0;//定义一个变量l代表当前谁下棋，0代表甲，1代表乙（甲的棋子为*，乙的棋子为#）
    bool gameOver = false;
    printf("棋盘：\n");
	srand(time(0));
	int num = rand()%2;//取一个随机数，如果能被2整除就提示甲先下棋，否则提示乙先下棋
	if (num == 0)
	{
		l = num;
	}
	else
	{
		l = num;
	}
	//开始下棋，打印棋盘
    for (;;)
    {
        for (int i = 0; i < 12; i++)
        {
            for (int j = 0; j < 12; j++)//如果当前位置还没下棋，打印整数，否则打印字符
            {
                if (arr[i][j] == 0)
                    printf("%d ", arr[i][j]);
                else
                    printf("%c ", arr[i][j]);
            }
            printf("\n");
        }
        //
        int p1 = 0;//代表行
        int p2 = 0;//代表列
        //输入棋子，判断棋子合法性
        if (gameOver)//游戏结束，结束循环
            break;
        for (;;)//死循环，直至棋子合法
        {
            if (l == 0)
                printf("甲下棋：");
            else if (l == 1)
                printf("乙下棋：");
            scanf("%d %d", &p1, &p2);
            getchar();
            if (p1 >= 12 || p2 >= 12)
            {
                printf("棋子输入不合法!\n");
                
            }
            else if (arr[p1][p2] != 0)
            {
                printf("当前位置不能重复输入!\n");
               
            }
            else
            {
                break;
            }

        }
        
        //甲下棋输入*，乙下棋输入#
        if (l == 0)
        {
            arr[p1][p2] = '*';
            l = 1;
        }
        else 
        {
            arr[p1][p2] = '#';
            l = 0;
        }
        //判断输赢
        //左右
        int count = 0;
        for (int j = p2 + 1; j < 12; j++) // 判断右方向
        {
            if (arr[p1][j] == arr[p1][p2])
                count++;
        }
        for (int j = p2 - 1; j >= 0; j--) // 判断左方向
        {
            if (arr[p1][j] == arr[p1][p2])
                count++;
        }
        if (count + 1 == 5)
        {
            printf("%s 赢了!\n", (l == 0 ? "乙" : "甲"));
            gameOver = true;
            continue;
        }

        // 垂直方向 row col 
        count = 0;
        for (int i = p1 - 1; i >= 0; i--)
        {
            if (arr[i][p2] == arr[p1][p2])
                count++;
        }
        for (int i = p1 + 1; i < 12; i++)
        {
            if (arr[i][p2] == arr[p1][p2])
                count++;
        }
        if (count + 1 == 5)
        {
            printf("%s 赢了!\n", (l == 0 ? "乙" : "甲"));
            gameOver = true;
            continue;
        }

        // 左上 - 右下
        count = 0;
        for (int i = p1 - 1, j = p2 - 1; i >= 0 && j >= 0; i--, j--)
        {
            if (arr[i][j] == arr[p1][p2])
                count++;
        }
        for (int i = p1 + 1, j = p2 + 1; i < 12 && j < 12; i++, j++)
        {
            if (arr[i][j] == arr[p1][p2])
                count++;
        }
        if (count + 1 == 5)
        {
            printf("%s 赢了!\n", (l == 0 ? "乙" : "甲"));
            gameOver = true;
            continue;
        }

        // 左下 - 右上
        count = 0;
        for (int i = p1 - 1, j = p2 + 1; i >= 0 && j < 12; i--, j++)
        {
            if (arr[i][j] == arr[p1][p2])
                count++;
        }
        for (int i = p1 + 1, j = p2 - 1; i > 12 && j >= 0; i++, j--)
        {
            if (arr[i][j] == arr[p1][p2])
                count++;
        }
        if (count + 1 == 5)
        {
            printf("%s 赢了!\n", (l == 0 ? "乙" : "甲"));
            gameOver = true;
            continue;
        }
        
    }
}